android 如何分析应用的内存(十六)

您所在的位置:网站首页 android studio运行内存 android 如何分析应用的内存(十六)

android 如何分析应用的内存(十六)

2024-07-09 16:23| 来源: 网络整理| 查看: 265

android 如何分析应用的内存(十六)——使用AS查看Android堆

在前面,先介绍了如何使用jdb和VS code查看应用栈相关内容。 本文将介绍,如何查看堆中的内容。大概有:

堆中的对象,有哪些堆中的对象,由谁分配堆中的对象,引用关系是怎么 堆中的对象有哪些,以及他们的引用关系——使用堆转储

要查看当前堆中的对象,需要使用工具将堆数据dump出来。

接下来,我们使用Android studio自带的memory profiler进行操作。

第一步:打开Android profiler 在Android Studio中,可以按照如下的步骤,打开memory profiler 在这里插入图片描述

在上图中,出现了两个选择,分别解释如下:

profile xxx with low overhead:性能分析器只会启用cpu性能分析器和 内存分析器,在内存分析器中,只有Record native allocations为启用 状态(即,录制native分配的功能为启用状态)profile xxx with complete data:启用所有的分析器,包括cpu分析器, 内存分析器,功耗分析器。

注意:除了上图通过图标启动以外,还可以通过菜单启动:Run->Profile.然后 选择要进行性能分析的模块。

注意:在性能不是很好的电脑上,可以单独运行Android profiler。如下: android studio安装目录/bin/profiler.xx(mac,linux为profiler.sh, windows为profiler.exe)

启动之后如下图 在这里插入图片描述

注意:一个session就表示一次性能分析,因此可以在Android Profiler中新建session,然后选择不同的应用进程。如下图: 在这里插入图片描述

第二步:打开Memory profiler

在上图中,点击memory的任何区域,打开memory profiler。下图展示了各个区域的具体意义。

在这里插入图片描述

如上图,各个类型解释如下,也可以参考,本系列的第一篇文章:[android 如何分析应用的内存 (一)——内存总览]http://t.csdn.cn/HN1Ma

Java:java或kotlin分配的对象的内存Native:c或者c++分配的内存Graphics:图形缓冲区队列为了向屏幕显示像素使用的内存,如GL表面,GL纹理。他们不是GPU专用内存,而是与cpu共用的内存Stack:java栈和native栈的内存,这个跟运行线程的多少有关Code:应用用于处理代码和资源的内存,如dex字节码,so库,字体等Others:无法确定分类的内存Allocated:应用分配的对象个数。在上图中是:N/A。即无法统计,如果能够统计,则会显示一跟虚线,Y轴则对应于图像的右侧,表示多少个对象数。

第三步:使用capture heap dump

为了查看堆中有多少对象,使用capture heap dump捕获当前的堆。如下图: 在这里插入图片描述

从上图可以看到,总共有727个类,所有对象按照类名,列在了列表中

对于上图的几个标记,分别解释如下:

标记1:选择不同的堆进行查看。有如下的堆可以查看

image heap:镜像堆,包含启动期间预加载的类。此处的分配不会移动或消失。zygote heap:zygote堆,继承于zygote进程,包含系统资源,类库。app heap:应用的分配的主堆JNI heap:jni引用的堆

注意:如何理解这四个堆,请见本文后面部分:如何理解Image heap,zygote heap,app heap,JNI heap

标记2:选择不同的排序方法,有如下几种:

arrange by class:按照类名排序arrange by package:按照报名排序arrange by callstack:按照调用栈排序。

注意:按照调用栈排序,在capture heap dump中不支持此功能,欲支持此功能需要使用:Record java/kotlin allocations。见后文:堆中的对象由谁分配

标记3:对类进行条件过滤,有如下几种:

show all classes:显示所有的类show activity/fragments classes:显示可能的Activity和fragment的泄露

注意:此处使用了”可能“两个字。事实上,memory profiler显示的泄露,不一定是真正的泄露

show project classes:显示本project中的类。

标记4:Allocations表示分配的次数,如第一排表示MaterialTextView分配了1次,即分配了一个对象

标记5:Native size表示该对象native的大小。尽管只有java代码或者kotlin代码,在某些情况下,依然会存在native的大小,因为java可以使用jni操作native的内存。上图第一行,表示native大小为0

标记6:shallow size表示本对象自身所具有的大小,有时又称为flat size.它不包含内部引用对象的大小。

标记7:Retained size表示本对象自身大小加上内部引用对象的大小。可以直接理解为:若该对象被回收,heap将会释放的大小,上图第一行表示:若MaterialTextView被回收,将会释放10381个字节

注意注意:如果A对象引用了E,C对象,而B对象也引用了E,C对象。那么A对象的retained size会包含E和C吗?B对象的retained size会包含E和C吗?关于retained size的计算,请见后文:如何计算 Shallow Size和retained size

标记8:搜索框,后面两个复选框表示是否大小写敏感,是否使用正则。

第四步:查看各个对象的引用关系

为了举例说明引用关系,现在写一个测试用的链表。如下

//首先定义一个测试类 public class WanbiaoTest{ public String value = "wanbiao_test"; public WanbiaoTest next ; } //链表的头,用字母o表示 private WanbiaoTest o ; //构建测试链表 public void do(){ for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3